home *** CD-ROM | disk | FTP | other *** search
/ Network PC / Network PC.iso / amiga utilities / communication / bbs / termv4.6 / extras / source / term-source.lha / PhonePanelPlus.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-18  |  13.4 KB  |  616 lines

  1. /*
  2. **    PhonePanelPlus.c
  3. **
  4. **    The phonebook and support routines
  5. **
  6. **    Copyright © 1990-1996 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. **
  9. **    :ts=4
  10. */
  11.  
  12. #ifndef _GLOBAL_H
  13. #include "Global.h"
  14. #endif
  15.  
  16.     // The gadget IDs are in there
  17.  
  18. #include "PhonePanel.h"
  19.  
  20. BOOL
  21. SaveChanges(struct Window *Parent)
  22. {
  23.     return((BOOL)ShowRequest(Parent,LocaleString(MSG_SAVE_CHANGES),LocaleString(MSG_GLOBAL_YES_NO_TXT)));
  24. }
  25.  
  26. BOOL
  27. EditConfig(struct Configuration *Config,LONG Type,ULONG Qualifier,struct Window *Window)
  28. {
  29.     STATIC LONG TypeMappings[15][2] =
  30.     {
  31.         GAD_SERIAL_EDIT,        PREF_SERIAL,
  32.         GAD_MODEM_EDIT,            PREF_MODEM,
  33.         GAD_SCREEN_EDIT,        PREF_SCREEN,
  34.         GAD_TERMINAL_EDIT,        PREF_TERMINAL,
  35.         GAD_EMULATION_EDIT,        PREF_EMULATION,
  36.         GAD_CLIPBOARD_EDIT,        PREF_CLIP,
  37.         GAD_CAPTURE_EDIT,        PREF_CAPTURE,
  38.         GAD_COMMAND_EDIT,        PREF_COMMAND,
  39.         GAD_MISC_EDIT,            PREF_MISC,
  40.         GAD_PATH_EDIT,            PREF_PATH,
  41.         GAD_TRANSFER_EDIT,        PREF_TRANSFER,
  42.         GAD_TRANSLATION_EDIT,    PREF_TRANSLATIONFILENAME,
  43.         GAD_MACRO_EDIT,            PREF_MACROFILENAME,
  44.         GAD_CURSOR_EDIT,        PREF_CURSORFILENAME,
  45.         GAD_FASTMACRO_EDIT,        PREF_FASTMACROFILENAME
  46.     };
  47.  
  48.     struct FileRequester    *FileRequest;
  49.     UBYTE                     DummyBuffer[MAX_FILENAME_LENGTH],
  50.                             *DummyChar;
  51.     BOOL                     Changed    = FALSE,
  52.                              FallBack    = TRUE;
  53.     LONG                     PrefType;
  54.     LONG                     i;
  55.     APTR                     Data;
  56.  
  57.         // Find the prefs fragment that should be worked upon
  58.  
  59.     for(i = 0 ; i < sizeof(TypeMappings) / (sizeof(LONG) * 2) ; i++)
  60.     {
  61.         if(TypeMappings[i][0] == Type)
  62.         {
  63.             PrefType = TypeMappings[i][1];
  64.  
  65.             break;
  66.         }
  67.     }
  68.  
  69.     Data = GetConfigEntry(Config,PrefType);
  70.  
  71.     if(CreateConfigEntry(Config,PrefType))
  72.     {
  73.         switch(Type)
  74.         {
  75.             case GAD_SERIAL_EDIT:
  76.  
  77.                 Changed = SerialPanel(Window,Config);
  78.                 break;
  79.  
  80.             case GAD_MODEM_EDIT:
  81.  
  82.                 Changed = ModemPanel(Window,Config);
  83.                 break;
  84.  
  85.             case GAD_SCREEN_EDIT:
  86.  
  87.                 Changed = ScreenPanel(Window,Config);
  88.                 break;
  89.  
  90.             case GAD_TERMINAL_EDIT:
  91.  
  92.                 Changed = TerminalPanel(Window,Config);
  93.                 break;
  94.  
  95.             case GAD_EMULATION_EDIT:
  96.  
  97.                 Changed = EmulationPanel(Window,Config);
  98.                 break;
  99.  
  100.             case GAD_CLIPBOARD_EDIT:
  101.  
  102.                 Changed = ClipPanel(Window,Config);
  103.                 break;
  104.  
  105.             case GAD_CAPTURE_EDIT:
  106.  
  107.                 Changed = CapturePanel(Window,Config);
  108.                 break;
  109.  
  110.             case GAD_COMMAND_EDIT:
  111.  
  112.                 Changed = CommandPanel(Window,Config);
  113.                 break;
  114.  
  115.             case GAD_MISC_EDIT:
  116.  
  117.                 Changed = MiscPanel(Window,Config);
  118.                 break;
  119.  
  120.             case GAD_PATH_EDIT:
  121.  
  122.                 Changed = PathPanel(Window,Config);
  123.                 break;
  124.  
  125.             case GAD_TRANSFER_EDIT:
  126.  
  127.                 Changed = LibPanel(Window,Config);
  128.                 break;
  129.  
  130.             case GAD_TRANSLATION_EDIT:
  131.  
  132.                 if(!(Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)))
  133.                 {
  134.                     struct TranslationEntry **Send,**Receive = NULL;
  135.                     BOOL            Success = FALSE;
  136.  
  137.                     strcpy(DummyBuffer,Config -> TranslationFileName);
  138.  
  139.                     if(Send = AllocTranslationTable())
  140.                     {
  141.                         if(Receive = AllocTranslationTable())
  142.                         {
  143.                             Success = TRUE;
  144.  
  145.                             if(DummyBuffer[0])
  146.                             {
  147.                                 if(!LoadTranslationTables(DummyBuffer,Send,Receive))
  148.                                 {
  149.                                     LONG Error = IoErr();
  150.  
  151.                                     if(Error != ERROR_OBJECT_NOT_FOUND)
  152.                                         ShowError(Window,ERR_LOAD_ERROR,Error,DummyBuffer);
  153.  
  154.                                     FillTranslationTable(Send);
  155.                                     FillTranslationTable(Receive);
  156.                                 }
  157.                             }
  158.                             else
  159.                             {
  160.                                 FillTranslationTable(Send);
  161.                                 FillTranslationTable(Receive);
  162.                             }
  163.                         }
  164.                     }
  165.  
  166.                     if(Success)
  167.                     {
  168.                         if(TranslationPanelConfig(NULL,&Send,&Receive,DummyBuffer,Window,NULL))
  169.                         {
  170.                             if(Send || Receive)
  171.                             {
  172.                                 if(IsStandardTable(Send) && IsStandardTable(Receive))
  173.                                     DummyBuffer[0] = 0;
  174.  
  175.                                 if(DummyBuffer[0])
  176.                                 {
  177.                                     if(SaveChanges(Window))
  178.                                     {
  179.                                         if(!SaveTranslationTables(DummyBuffer,Send,Receive))
  180.                                             ShowError(Window,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
  181.                                     }
  182.                                 }
  183.                             }
  184.                             else
  185.                                 DummyBuffer[0] = 0;
  186.                         }
  187.  
  188.                         if(strcmp(Config -> TranslationFileName,DummyBuffer))
  189.                         {
  190.                             strcpy(Config -> TranslationFileName,DummyBuffer);
  191.  
  192.                             Changed = TRUE;
  193.                         }
  194.  
  195.                         FallBack = FALSE;
  196.                     }
  197.  
  198.                     if(Send)
  199.                         FreeTranslationTable(Send);
  200.  
  201.                     if(Receive)
  202.                         FreeTranslationTable(Receive);
  203.                 }
  204.  
  205.                 if(FallBack)
  206.                 {
  207.                     SplitFileName(Config -> TranslationFileName,&DummyChar,DummyBuffer);
  208.  
  209.                     if(FileRequest = GetFile(Window,LocaleString(MSG_PHONEPANEL_SELECT_TRANSLATION_TXT),DummyBuffer,DummyChar,DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SELECT_TXT),TRUE))
  210.                     {
  211.                         strcpy(Config -> TranslationFileName,DummyBuffer);
  212.  
  213.                         FreeAslRequest(FileRequest);
  214.  
  215.                         Changed = TRUE;
  216.                     }
  217.                 }
  218.  
  219.                 break;
  220.  
  221.             case GAD_MACRO_EDIT:
  222.  
  223.                 if(!(Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)))
  224.                 {
  225.                     struct MacroKeys *Keys;
  226.  
  227.                     if(Keys = (struct MacroKeys *)AllocVecPooled(sizeof(struct MacroKeys),MEMF_ANY | MEMF_CLEAR))
  228.                     {
  229.                         strcpy(DummyBuffer,Config -> MacroFileName);
  230.  
  231.                         if(DummyBuffer[0])
  232.                         {
  233.                             if(!LoadMacros(DummyBuffer,Keys))
  234.                             {
  235.                                 LONG Error = IoErr();
  236.  
  237.                                 if(Error != ERROR_OBJECT_NOT_FOUND)
  238.                                     ShowError(Window,ERR_LOAD_ERROR,Error,DummyBuffer);
  239.                             }
  240.                         }
  241.  
  242.                         if(MacroPanelConfig(NULL,Keys,DummyBuffer,Window,NULL))
  243.                         {
  244.                             if(DummyBuffer[0] && SaveChanges(Window))
  245.                             {
  246.                                 if(!WriteIFFData(DummyBuffer,Keys,sizeof(struct MacroKeys),ID_KEYS))
  247.                                     ShowError(Window,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
  248.                             }
  249.                         }
  250.  
  251.                         if(strcmp(Config -> MacroFileName,DummyBuffer))
  252.                         {
  253.                             strcpy(Config -> MacroFileName,DummyBuffer);
  254.  
  255.                             Changed = TRUE;
  256.                         }
  257.  
  258.                         FallBack = FALSE;
  259.  
  260.                         FreeVecPooled(Keys);
  261.                     }
  262.                 }
  263.  
  264.                 if(FallBack)
  265.                 {
  266.                     SplitFileName(Config -> MacroFileName,&DummyChar,DummyBuffer);
  267.  
  268.                     if(FileRequest = GetFile(Window,LocaleString(MSG_PHONEPANEL_SELECT_KEYBOARD_MACROS_TXT),DummyBuffer,DummyChar,DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SELECT_TXT),TRUE))
  269.                     {
  270.                         strcpy(Config -> MacroFileName,DummyBuffer);
  271.  
  272.                         FreeAslRequest(FileRequest);
  273.  
  274.                         Changed = TRUE;
  275.                     }
  276.                 }
  277.  
  278.                 break;
  279.  
  280.             case GAD_CURSOR_EDIT:
  281.  
  282.                 if(!(Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)))
  283.                 {
  284.                     struct CursorKeys *Keys;
  285.  
  286.                     if(Keys = (struct CursorKeys *)AllocVecPooled(sizeof(struct CursorKeys),MEMF_ANY | MEMF_CLEAR))
  287.                     {
  288.                         strcpy(DummyBuffer,Config -> CursorFileName);
  289.  
  290.                         if(DummyBuffer[0])
  291.                         {
  292.                             if(!ReadIFFData(DummyBuffer,Keys,sizeof(struct CursorKeys),ID_KEYS))
  293.                             {
  294.                                 LONG Error = IoErr();
  295.  
  296.                                 ResetCursorKeys(Keys);
  297.  
  298.                                 if(Error != ERROR_OBJECT_NOT_FOUND)
  299.                                     ShowError(Window,ERR_LOAD_ERROR,Error,DummyBuffer);
  300.                             }
  301.                         }
  302.                         else
  303.                             ResetCursorKeys(Keys);
  304.  
  305.                         if(CursorPanelConfig(NULL,Keys,DummyBuffer,Window,NULL))
  306.                         {
  307.                             if(DummyBuffer[0] && SaveChanges(Window))
  308.                             {
  309.                                 if(!WriteIFFData(DummyBuffer,Keys,sizeof(struct CursorKeys),ID_KEYS))
  310.                                     ShowError(Window,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
  311.                             }
  312.                         }
  313.  
  314.                         if(strcmp(Config -> CursorFileName,DummyBuffer))
  315.                         {
  316.                             strcpy(Config -> CursorFileName,DummyBuffer);
  317.  
  318.                             Changed = TRUE;
  319.                         }
  320.  
  321.                         FallBack = FALSE;
  322.  
  323.                         FreeVecPooled(Keys);
  324.                     }
  325.                 }
  326.  
  327.                 if(FallBack)
  328.                 {
  329.                     SplitFileName(Config -> CursorFileName,&DummyChar,DummyBuffer);
  330.  
  331.                     if(FileRequest = GetFile(Window,LocaleString(MSG_PHONEPANEL_SELECT_CURSOR_KEYS_TXT),DummyBuffer,DummyChar,DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SELECT_TXT),TRUE))
  332.                     {
  333.                         strcpy(Config -> CursorFileName,DummyBuffer);
  334.  
  335.                         FreeAslRequest(FileRequest);
  336.  
  337.                         Changed = TRUE;
  338.                     }
  339.                 }
  340.  
  341.                 break;
  342.  
  343.             case GAD_FASTMACRO_EDIT:
  344.  
  345.                 if(!(Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)))
  346.                 {
  347.                     struct List *List;
  348.  
  349.                     if(List = CreateList())
  350.                     {
  351.                         strcpy(DummyBuffer,Config -> FastMacroFileName);
  352.  
  353.                         if(DummyBuffer[0])
  354.                         {
  355.                             if(!LoadFastMacros(DummyBuffer,List))
  356.                             {
  357.                                 LONG Error = IoErr();
  358.  
  359.                                 if(Error != ERROR_OBJECT_NOT_FOUND)
  360.                                     ShowError(Window,ERR_LOAD_ERROR,Error,DummyBuffer);
  361.                             }
  362.                         }
  363.  
  364.                         if(FastMacroPanelConfig(NULL,List,DummyBuffer,Window,NULL))
  365.                         {
  366.                             if(DummyBuffer[0] && SaveChanges(Window))
  367.                             {
  368.                                 if(!SaveFastMacros(DummyBuffer,List))
  369.                                     ShowError(Window,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
  370.                             }
  371.                         }
  372.  
  373.                         if(strcmp(Config -> FastMacroFileName,DummyBuffer))
  374.                         {
  375.                             strcpy(Config -> FastMacroFileName,DummyBuffer);
  376.  
  377.                             Changed = TRUE;
  378.                         }
  379.  
  380.                         FallBack = FALSE;
  381.  
  382.                         DeleteList(List);
  383.                     }
  384.                 }
  385.  
  386.                 if(FallBack)
  387.                 {
  388.                     SplitFileName(Config -> FastMacroFileName,&DummyChar,DummyBuffer);
  389.  
  390.                     if(FileRequest = GetFile(Window,LocaleString(MSG_PHONEPANEL_SELECT_FAST_MACROS_TXT),DummyBuffer,DummyChar,DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SELECT_TXT),TRUE))
  391.                     {
  392.                         strcpy(Config -> FastMacroFileName,DummyBuffer);
  393.  
  394.                         FreeAslRequest(FileRequest);
  395.  
  396.                         Changed = TRUE;
  397.                     }
  398.                 }
  399.  
  400.                 break;
  401.         }
  402.  
  403.         if(!Changed && !Data)
  404.             DeleteConfigEntry(Config,PrefType);
  405.     }
  406.     else
  407.         DisplayBeep(Window -> WScreen);
  408.  
  409.     return(Changed);
  410. }
  411.  
  412. BOOL
  413. ChangeState(LONG Type,LONG Default,struct PhoneNode *Node)
  414. {
  415.     STATIC LONG TypeMappings[][2] =
  416.     {
  417.         GAD_SERIAL_STATE,        PREF_SERIAL,
  418.         GAD_MODEM_STATE,        PREF_MODEM,
  419.         GAD_SCREEN_STATE,        PREF_SCREEN,
  420.         GAD_TERMINAL_STATE,        PREF_TERMINAL,
  421.         GAD_EMULATION_STATE,    PREF_EMULATION,
  422.         GAD_CLIPBOARD_STATE,    PREF_CLIP,
  423.         GAD_CAPTURE_STATE,        PREF_CAPTURE,
  424.         GAD_COMMAND_STATE,        PREF_COMMAND,
  425.         GAD_MISC_STATE,            PREF_MISC,
  426.         GAD_PATH_STATE,            PREF_PATH,
  427.         GAD_TRANSFER_STATE,        PREF_TRANSFER,
  428.         GAD_TRANSLATION_STATE,    PREF_TRANSLATIONFILENAME,
  429.         GAD_MACRO_STATE,        PREF_MACROFILENAME,
  430.         GAD_CURSOR_STATE,        PREF_CURSORFILENAME,
  431.         GAD_FASTMACRO_STATE,    PREF_FASTMACROFILENAME,
  432.         GAD_RATE_STATE,            PREF_RATES
  433.     };
  434.  
  435.     struct Configuration    *LocalConfig;
  436.     LONG                     PrefType;
  437.     LONG                     i;
  438.     APTR                     Data;
  439.  
  440.         // Find the prefs fragment that should be worked upon
  441.  
  442.     for(i = 0 ; i < sizeof(TypeMappings) / (sizeof(LONG) * 2) ; i++)
  443.     {
  444.         if(TypeMappings[i][0] == Type)
  445.         {
  446.             PrefType = TypeMappings[i][1];
  447.  
  448.             break;
  449.         }
  450.     }
  451.  
  452.         // This is the one we're about to put through the wringer
  453.  
  454.     LocalConfig = Node -> Entry -> Config;
  455.  
  456.         // A special case, the phone rates
  457.  
  458.     if(PrefType == PREF_RATES)
  459.     {
  460.         if(Default)
  461.         {
  462.                 // There will be some rates...
  463.  
  464.             Node -> Entry -> Header -> NoRates = FALSE;
  465.  
  466.                 // Nothing in this list?
  467.  
  468.             if(!Node -> Entry -> TimeDateList . mlh_Head -> mln_Succ)
  469.             {
  470.                 struct TimeDateNode *TimeDateNode;
  471.  
  472.                     // Provide defaults
  473.  
  474.                 if(TimeDateNode = CreateTimeDateNode(-1,-1,"",2))
  475.                     AddTail((struct List *)&Node -> Entry -> TimeDateList,&TimeDateNode -> VanillaNode);
  476.                 else
  477.                 {
  478.                     Node -> Entry -> Header -> NoRates = TRUE;    // Sorry, guv'nor
  479.  
  480.                     return(FALSE);
  481.                 }
  482.             }
  483.         }
  484.         else
  485.         {
  486.                 // Discard the time/date list
  487.  
  488.             FreeTimeDateList((struct List *)&Node -> Entry -> TimeDateList);
  489.  
  490.                 // No rates here
  491.  
  492.             Node -> Entry -> Header -> NoRates = TRUE;
  493.         }
  494.  
  495.         return(TRUE);
  496.     }
  497.  
  498.         // Get a pointer to it
  499.  
  500.     Data = GetConfigEntry(LocalConfig,PrefType);
  501.  
  502.         // Default == TRUE means: replace fragment with a copy of the
  503.         //                        current global configuration which the
  504.         //                        user can edit later. Making a connection
  505.         //                        through the phonebook will cause the
  506.         //                        global configuration to be replaced
  507.         //                        with this copy.
  508.  
  509.     if(Default)
  510.     {
  511.         BOOL Result;
  512.  
  513.             // Get rid of the old stuff
  514.  
  515.         if(Data)
  516.         {
  517.             DeleteConfigEntry(LocalConfig,PrefType);
  518.  
  519.             Result = TRUE;
  520.         }
  521.         else
  522.             Result = FALSE;
  523.  
  524.             // Create a new fragment with default values
  525.  
  526.         if(!CreateConfigEntry(LocalConfig,PrefType))
  527.             return(Result);
  528.     }
  529.     else
  530.     {
  531.             // Default == FALSE means: discard this fragment; making a
  532.             //                         connection through the phonebook
  533.             //                         will then leave these main config
  534.             //                         fragments unmodified.
  535.  
  536.         if(Data)
  537.             DeleteConfigEntry(LocalConfig,PrefType);
  538.         else
  539.             return(FALSE);
  540.     }
  541.  
  542.     return(TRUE);
  543. }
  544.  
  545. STRPTR *
  546. BuildLabels()
  547. {
  548.     LONG         Count;
  549.     struct Node    *Node;
  550.     STRPTR        *Labels;
  551.     LONG         i;
  552.  
  553.     for(Count = 0, Node = (struct Node *)PhoneGroupList . mlh_Head ; Node -> ln_Succ ; Node = Node -> ln_Succ)
  554.         Count++;
  555.  
  556.     if(!(Labels = (STRPTR *)AllocVecPooled(sizeof(STRPTR) * (Count + 2),MEMF_ANY)))
  557.         return(NULL);
  558.  
  559.     Labels[0] = LocaleString(MSG_PHONEBOOK_ALL_GROUP_TXT);
  560.  
  561.     for(i = 1, Node = (struct Node *)PhoneGroupList . mlh_Head ; Node -> ln_Succ ; Node = Node -> ln_Succ)
  562.         Labels[i++] = Node -> ln_Name;
  563.  
  564.     Labels[i] = NULL;
  565.  
  566.     return(Labels);
  567. }
  568.  
  569. VOID
  570. FindGroup(struct List **pCurrentList,LONG *pSelected,ULONG *pGrouper,struct List *PhoneList,struct MinList *List,struct PhoneNode *This)
  571. {
  572.     PhoneGroupNode        *GroupNode;
  573.     struct PhoneNode    *Node;
  574.     LONG                 Index;
  575.     ULONG                 Group;
  576.  
  577.     Group = 1;
  578.  
  579.     for(GroupNode = (PhoneGroupNode *)List -> mlh_Head ; GroupNode -> Node . ln_Succ ; GroupNode = (PhoneGroupNode *)GroupNode -> Node . ln_Succ)
  580.     {
  581.         Index = 0;
  582.  
  583.         for(Node = (struct PhoneNode *)GroupNode -> GroupList . mlh_Head ; Node -> VanillaNode . ln_Succ ; Node = (struct PhoneNode *)Node -> VanillaNode . ln_Succ)
  584.         {
  585.             if(Node == This)
  586.             {
  587.                 *pCurrentList    = (struct List *)&GroupNode -> GroupList;
  588.                 *pSelected        = Index;
  589.                 *pGrouper        = Group;
  590.  
  591.                 return;
  592.             }
  593.  
  594.             Index++;
  595.         }
  596.  
  597.         Group++;
  598.     }
  599.  
  600.     Index = 0;
  601.  
  602.     for(Node = (struct PhoneNode *)PhoneList -> lh_Head ; Node -> VanillaNode . ln_Succ ; Node = (struct PhoneNode *)Node -> VanillaNode . ln_Succ)
  603.     {
  604.         if(Node == This)
  605.         {
  606.             *pCurrentList    = PhoneList;
  607.             *pSelected        = Index;
  608.             *pGrouper        = 0;
  609.  
  610.             return;
  611.         }
  612.  
  613.         Index++;
  614.     }
  615. }
  616.